package example;


import java.util.*;
import org.apache.uima.*;
import org.apache.uima.analysis_component.JCasAnnotator_ImplBase;
import org.apache.uima.analysis_engine.AnalysisEngineProcessException;
import org.apache.uima.cas.FSIndex;
import org.apache.uima.cas.FSIterator;
import org.apache.uima.cas.text.AnnotationIndex;
import org.apache.uima.jcas.JCas;
import org.apache.uima.jcas.cas.FSArray;
import org.apache.uima.jcas.cas.StringArray;


import org.apache.uima.TokenAnnotation;
//import org.apache.uima.SentenceAnnotation;
import example.types.source.POS;
import example.types.source.Sentence;
import example.types.source.Word;

public class PreTypeMapperAE extends JCasAnnotator_ImplBase {

	//On suppose que le fichier Xml est contenu dans le répertoire resources situé dans le path du projet
	public void initialize(UimaContext context) 
	{


	}

	// On va créer une annotation Pos pour chaque trait postTag de TokenAnnotation
	// et qui aura pour feature value la valeur de posTag
	// et on va ajouter des traits à TokenAnnotation
	// le nombre de caractères du token
	// le POS
	public void process(JCas aJCas) throws AnalysisEngineProcessException {

		FSIndex tokenAnnotationFSIdx = aJCas.getAnnotationIndex(TokenAnnotation.type);
		Iterator tokenAnnotationIter = tokenAnnotationFSIdx.iterator();   

		// Pour chaque TokenAnnotation on crée aux mêmes offsets un POS, un Word, 
		// ainsi que les features simples sizeInt, posString 
		// et complexe posType (admet un objet POS aux mêmes offsets) 
		// de POS
		while (tokenAnnotationIter.hasNext()) {
			TokenAnnotation tokenAnnotation = (TokenAnnotation)tokenAnnotationIter.next();

			POS pos = new POS(aJCas);
			pos.addToIndexes();
			pos.setBegin(tokenAnnotation.getBegin());
			pos.setEnd(tokenAnnotation.getEnd());
			pos.setValue(tokenAnnotation.getPosTag());
			pos.addToIndexes();

			Word word = new Word(aJCas);
			word.setBegin(tokenAnnotation.getBegin());
			word.setEnd(tokenAnnotation.getEnd());
			word.setSizeInt(tokenAnnotation.getEnd() - tokenAnnotation.getBegin());
			word.setPosType(pos);
			word.setPosString(tokenAnnotation.getPosTag());
			word.addToIndexes();
		}

		// Pour chaque SentenceAnnotation on crée une Sentence
		// avec comme feature complexe un FSArray de tous les Word qu'elle subsume
		// On commence par TokenAnnotation avant Word

		// http://www.fabienpoulard.info/index.php?post/2010/04/01/Parcours-des-annotations-couvertes-par-une-autre-annotation
		
		// Récupération des index
		AnnotationIndex sentenceAnnotationAnnIdx = (AnnotationIndex) aJCas.getAnnotationIndex(SentenceAnnotation.type);
		AnnotationIndex tokenAnnotationAnnIdx = (AnnotationIndex) aJCas.getAnnotationIndex(TokenAnnotation.type);	
		// On recherche ''SentenceAnnotation:3''
		FSIterator sentenceAnnotationFSIter = sentenceAnnotationAnnIdx.iterator();

		while (sentenceAnnotationFSIter.hasNext()) {

			SentenceAnnotation sentenceAnnotation = (SentenceAnnotation) sentenceAnnotationFSIter.next();
			
			// On récupére l'itérateur sur les annotations TokenAnnotation couvertes par SentenceAnnotation
			FSIterator tokenAnnotationSubSentenceAnnotationFSIter = tokenAnnotationAnnIdx.subiterator(sentenceAnnotation);
	
			// http://www.fabienpoulard.info/index.php?post/2009/07/30/UIMA-:-Comment-utiliser-un-type-dont-un-attribut-est-un-tableau-de-types
			ArrayList<TokenAnnotation> tokenAnnotationArrayLst = new ArrayList<TokenAnnotation>();
			
			while (tokenAnnotationSubSentenceAnnotationFSIter.hasNext()) {
				// On récupére successivement les différents TokenAnnotation
				TokenAnnotation tokenAnnotation = (TokenAnnotation) tokenAnnotationSubSentenceAnnotationFSIter.next();
				System.out.println("Sous tokenAnnotation : "+tokenAnnotation);
				tokenAnnotationArrayLst.add(tokenAnnotation);
			}
			
			// Transformation en tableau "statique"
			TokenAnnotation[] tokenAnnotationStaticArray = tokenAnnotationArrayLst.toArray(new TokenAnnotation[tokenAnnotationArrayLst.size()]);
			// Création du FSArray
			FSArray wordFSArray = new FSArray(aJCas, tokenAnnotationStaticArray.length);
			wordFSArray.copyFromArray(tokenAnnotationStaticArray, 0, 0, tokenAnnotationStaticArray.length);
			// Création d'une instance du type complexe et ajout du contenu
			Sentence sentence = new Sentence(aJCas);
			sentence.setWordArray(wordFSArray);
			
			String[] stringStaticArray = new String[tokenAnnotationStaticArray.length];
			for (int i = 0; i < tokenAnnotationStaticArray.length; i++) {
				TokenAnnotation tokenAnnotation = tokenAnnotationStaticArray[i];
				stringStaticArray[i] = tokenAnnotation.getPosTag();
			} 
			
			StringArray stringArray =  new StringArray(aJCas, tokenAnnotationStaticArray.length);
			stringArray.copyFromArray(stringStaticArray, 0, 0, tokenAnnotationStaticArray.length);
			sentence.setStringArray(stringArray);
				
			sentence.setBegin(sentenceAnnotation.getBegin());
			sentence.setEnd(sentenceAnnotation.getEnd());
			sentence.addToIndexes();

		}

	}
}
